#ifndef THREAD__H
#define THREAD__H

#include <pthread.h> 
#include "Lock.h"
#include "ConstValues.h"

#ifdef WIN32
//#include <windows.h>
#else
#include <unistd.h>
#endif



class Thread{

public:
	Thread(bool isDetachable);
	/*Lanza el thread*/
	virtual void start();
	/*pide al thread que finalize sus tareas lo antes posible*/
	virtual void stop();
	/*Indica si el thread esta corriendo o no*/
	virtual bool running();
	/*Espera a que el thread termine*/
	virtual void join();
	/*Espera a que el thread termine, y luego lo libera*/
	virtual ~Thread();
	/*Duermen el thread actual un cierta cantidad de milisegundos*/
	static void sleep(unsigned long msec);
	
	virtual int getStatus();
protected:
	/*debe ser implementado por las subclases*/
	virtual void main()=0;
	
	void setRunning(bool value);
	
	bool isrunning;
	
	int status;
	
	virtual void setStatus(int);
private:
	
	pthread_t t;
	
	/*Mutex m;*/

	Lock lock;
	
	bool detached;
	
	bool joined;
	
	bool created;
	
	static void* static_run(void* arg);

	Thread(const Thread &);

	Thread& operator=(const Thread &);
	
};
#endif
